<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>

</html>

<script>
    // 单例模式
    // const Person = (function () {
    //     let instanse = null;
    //     function Person() {
    //         this.name = 'zs'
    //     }
    //     return function singleTon() {
    //         if (instanse === null) instanse = new Person()
    //         return instanse
    //     }
    // })()

    // const p1 = Person()
    // const p2 = Person()
    // console.log(p1 === p2);
    // 观察者
    // class Observer {
    //     constructor(name, fn = () => { }) {
    //         this.name = name;
    //         this.fn = fn
    //     }
    // }
    // 观察者
    // const test = new Observer('测试', () => {
    //     console.log('你的项目出现bug');
    // })
    // const product = new Observer('产品', () => {
    //     console.log('你的项目来新的需求');
    // })
    // const leader = new Observer('主管', () => {
    //     console.log('好好工作 别偷懒');
    // })
    // class Subject {
    //     constructor(state) {
    //         this.state = state
    //         this.observsers = []
    //     }
    //     setState(val) {
    //         this.state = val
    //         this.observsers.forEach(item => {
    //             item.fn(this.state)
    //         })
    //     }
    //     addObserver(obs) {
    //         this.observsers = this.observsers.filter(item => item !== obs)
    //         this.observsers.push(obs)
    //     }
    //     delObserve(obs) {
    //         this.observsers = this.observsers.filter(item => item.name !== obs)
    //     }
    // }
    // const xm = new Subject('摸鱼');
    // xm.addObserver(leader)
    // xm.addObserver(test)
    // xm.setState('划水')

    // console.log(xm);

    // 发布订阅
    // class Observer {
    //     constructor() {
    //         this.message = {}
    //     }
    //     add(type, fn) {
    //         if (!this.message[type]) {
    //             this.message[type] = []
    //         }
    //         this.message[type].push(fn)
    //     }
    //     del(type, fn) {
    //         if (!fn) {
    //             delete this.message[type]
    //             return
    //         }
    //         if (!this.message[type]) return
    //         this.message[type] = this.message[type].filter(item => item !== fn)
    //     }
    //     emit(type) {
    //         if (!this.message[type]) return
    //         this.message[type].forEach(element => {
    //             element()
    //         });
    //     }
    // }
    // const person1 = new Observer()
    // person1.add('clict', handlerA)
    // person1.add('clict', handlerB)
    // person1.add('move', handlerA)

    // person1.del('clict')

    // function handlerA() {
    //     console.log('点击了');
    // }
    // function handlerB() {
    //     console.log('鼠标点击');
    // }
    // person1.emit('clict')
    // person1.emit('move')

    // console.log(person1);


    // 策略模式
    // const calcVacation = (function () {
    //     const sale = {
    //         '年假': function (vacation) { return console.log('请年假'); },
    //         '事假': function (vacation) { return console.log('请事假'); },
    //         '病假': function (vacation) { return console.log('请病假'); }
    //     }
    //     function clacVacation(vacation) {
    //         if (sale[vacation]) {
    //             return sale[vacation]()
    //         }
    //         return console.log('你没有这个假期');
    //     }
    //     clacVacation.add = function (type, fn) {
    //         if (sale[type]) return console.log('你已经有这个假期了');
    //         sale[type] = fn
    //     }
    //     clacVacation.del = function (type) {
    //         delete sale[type]
    //     }
    //     return clacVacation
    // })()
    // calcVacation.add('事假', function () { return console.log('请假'); })
    // calcVacation.del('病假')
    // calcVacation('事假')

</script>